export default class SocketService {
  // 单例模式
  static instance = null;
  static get Instance() {
    if (!this.instance) {
      this.instance = new SocketService();
    }
    return this.instance;
  }
  //  和服务端连接的socket对象
  ws = null;

  // 存储回调函数
  callBackMapping = {};

  // 标识是否连接成功了
  connected = false;

  // 记录重试的次数
  sendCount = 0;

  // 记录重新连接尝试的次数
  connectCount = 0;

  // 连接服务器方法
  connect() {
    if (!window.WebSocket) {
      console.log("你的浏览器不支持WebSocket");
      return;
    }
    this.ws = new WebSocket("ws://localhost:9998");

    // 连接成功的事件
    this.ws.onopen = () => {
      console.log("WebSocket连接成功");
      this.connected = true;
      this.connectCount = 0;
    };
    // 连接失败的事件
    this.ws.onclose = () => {
      console.log("WebSocket已断开");
      this.connected = false;
      this.connectCount++;
      setTimeout(() => {
        // 重新连接操作
        this.connect();
      }, this.connectCount * 500);
    };
    // 得到服务端发送的数据
    this.ws.onmessage = (msg) => {
      const res = JSON.parse(msg.data);
      const socketType = res.socketType;
      // 判断回调函数是否存在
      if (this.callBackMapping[socketType]) {
        const action = res.action;
        if (action === "getData") {
          const realData = JSON.parse(res.data);
          this.callBackMapping[socketType].call(this, realData);
        } else if (action === "fullScreen") {
          this.callBackMapping[socketType].call(this, res);
        } else if (action === "themeChange") {
        }
      }
    };
  }
  // 回调函数的注册
  registerCallBack(socketType, callBack) {
    this.callBackMapping[socketType] = callBack;
  }
  // 取消某一个回调函数
  unRegisterCallBack(socketType) {
    this.callBackMapping[socketType] = null;
  }

  // 发送数据的方法
  send(data) {
    // 判断是否连接成功了
    if (this.connected) {
      this.ws.send(JSON.stringify(data));
    } else {
      // 重试
      this.sendCount++;
      setTimeout(() => {
        this.send(data);
      }, this.sendCount * 500);
    }
  }
}
